const AUTH_KEY = 'currentUser';

// 后端API的基础URL，根据实际情况修改
const API_BASE_URL = 'http://localhost:8888/api'; // 假设后端运行在 8888 端口

// 模拟用户数据 (将被后端数据取代)
// const MOCK_USERS = {
//     admin: { username: 'admin', password: 'password123', role: 'admin', name: '超级管理员' },
//     student: { username: 'student001', password: 'password123', role: 'student', name: '张三' }
// };

const TOKEN_KEY = 'jwtToken'; // localStorage 中存储 Token 的键名
const CURRENT_USER_KEY = 'currentUser';

// --- Token Management ---
function storeToken(token) {
    localStorage.setItem(TOKEN_KEY, token);
}

function getToken() {
    return localStorage.getItem(TOKEN_KEY);
}

function removeToken() {
    localStorage.removeItem(TOKEN_KEY);
}

// --- Current User Management ---
function setCurrentUser(user) { // user: { username, name, role, authorities }
    localStorage.setItem(CURRENT_USER_KEY, JSON.stringify(user));
}

function getCurrentUser() {
    const user = localStorage.getItem(CURRENT_USER_KEY);
    return user ? JSON.parse(user) : null;
}

function removeCurrentUser() {
    localStorage.removeItem(CURRENT_USER_KEY);
}

// --- Authentication Check ---
function checkAuth(requiredRole = null) {
    const token = getToken();
    const currentUser = getCurrentUser();

    if (!token || !currentUser) {
        if (!window.location.pathname.endsWith('login.html') && 
            !window.location.pathname.endsWith('index.html') && 
            window.location.pathname !== '/') {
            console.warn("No token or user found, redirecting to login.");
            window.location.href = 'login.html'; // 调整为您的登录页面路径
        }
        return false;
    }

    if (requiredRole && currentUser.role.toLowerCase() !== requiredRole.toLowerCase()) {
        console.warn(`Role mismatch for auth check. Required: ${requiredRole}, User: ${currentUser.role}`);
        // 对于JWT，主要依赖后端授权。前端检查更多是UI导向。
        // 考虑不在此处重定向，让API调用失败并由fetchApi处理403。
        // 或者，如果确实要阻止，可以提示并重定向：
        // show汎用Toast('您没有权限访问此页面。', 'danger'); // 需要一个通用的Toast函数
        // window.location.href = 'login.html'; 
        return false; // 如果要严格阻止
    }
    return true;
}

// --- Logout ---
function logout() {
    const userName = getCurrentUser()?.name || '用户';
    removeToken();
    removeCurrentUser();
    
    // 这里的 showAdminToast 来自 admin.js，如果 auth.js 要独立，需要处理依赖
    // 我们可以先假设它在 admin 页面可用，在其他页面可能需要不同的 toast
    if (typeof showAdminToast === 'function') {
        showAdminToast(`${userName} 已成功登出。`, "info");
    } else if (typeof showLoginToast === 'function') { // 假设 login.js 也有 toast
        showLoginToast('您已成功登出。', 'info');
    } else {
        alert('您已成功登出。');
    }

    setTimeout(() => {
        window.location.href = 'login.html'; // 调整为您的登录页面路径
    }, 1500);
}

// 登录函数
async function login(username, password, role) {
    try {
        const response = await fetch(`${API_BASE_URL}/auth/login`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({ username, password, role })
        });

        if (!response.ok) {
            const errorData = await response.json().catch(() => ({ message: '登录失败，请检查您的凭据或联系管理员。' }));
            // 后端可能返回如 { message: "用户名或密码错误" } 或更详细的错误
            // 如果 response.json() 失败，则使用通用错误消息
            throw new Error(errorData.message || `HTTP error! status: ${response.status}`);
        }

        const userData = await response.json();
        
        // 后端返回的数据结构示例:
        // {
        //     "message": "登录成功",
        //     "username": "actual_username_from_db", // e.g. admin or stu_no
        //     "name": "Display Name", // e.g. 超级管理员 or 学生姓名
        //     "role": "admin", // or "student"
        //     "authorities": ["ROLE_ADMIN"] // or ["ROLE_STUDENT"]
        // }
        // 我们将整个对象存储，或者只存储需要的部分
        // 为了与现有逻辑兼容，我们至少需要 username, name, role
        localStorage.setItem('currentUser', JSON.stringify({
            id: userData.id, // 假设后端返回的学生ID字段是 id
            studentId: userData.studentId || userData.id, // 尝试兼容 studentId 或 id，优先 studentId
            username: userData.username, // 使用后端返回的username (可能是学号或管理员名)
            name: userData.name,         // 使用后端返回的显示名称
            role: userData.role.toLowerCase(),         // 统一角色为小写
            authorities: userData.authorities
        }));
        return getCurrentUser(); // 返回存储的用户信息
    } catch (error) {
        console.error('Login failed:', error);
        throw error; // 将错误重新抛出，以便调用者可以处理
    }
}

// 通用Toast显示函数 (如果需要可以在这里定义，或者保持在各个页面JS中)
// function showToast(containerId, message, type = 'info') {
//     // ... (可以从 admin.js 或 student.js 迁移过来一个通用版本)
// }

// 示例：在需要的地方调用 showToast
// showToast('toastContainerAdmin', '操作成功', 'success'); 
